Skip to main content

aviutl2\generic\binding/
mod.rs

1/// 汎用プラグインの情報を表す構造体。
2#[derive(Debug, Clone)]
3pub struct GenericPluginTable {
4    /// プラグインの名前。
5    pub name: String,
6    /// プラグインの情報。
7    /// 「プラグイン情報」ダイアログで表示されます。
8    pub information: String,
9}
10
11/// 汎用プラグインのトレイト。
12/// このトレイトを実装し、[`crate::register_generic_plugin!`] マクロを使用してプラグインを登録します。
13pub trait GenericPlugin: Send + Sync + Sized {
14    /// プラグインを初期化する。
15    fn new(info: crate::common::AviUtl2Info) -> crate::common::AnyResult<Self>;
16
17    /// プラグインの情報を返す。
18    fn plugin_info(&self) -> crate::generic::GenericPluginTable;
19
20    /// プラグインをホストに登録する。
21    fn register(&mut self, registry: &mut crate::generic::HostAppHandle);
22
23    /// プロジェクトファイルのロードを処理する。
24    ///
25    /// プロジェクトの初期化時にも呼ばれます。
26    fn on_project_load(&mut self, project: &mut crate::generic::ProjectFile) {
27        let _ = project;
28    }
29
30    /// プロジェクトファイルをセーブする直前に呼ばれる。
31    fn on_project_save(&mut self, project: &mut crate::generic::ProjectFile) {
32        let _ = project;
33    }
34
35    /// 「キャッシュを破棄」が呼ばれたときに呼ばれる。
36    fn on_clear_cache(&mut self, edit_section: &crate::generic::EditSection) {
37        let _ = edit_section;
38    }
39
40    // NOTE:
41    // register_change_scene_handlerのコールバックはAviUtl2内でシーンを編集したときに呼ばれるが、これは同期的に呼ばれてしまう。
42    // それにより、
43    // - (register_menusなどで)GenericPluginをwriteロックしているスレッドから
44    // - その中でEditSectionでシーンを編集する
45    // という操作を行うと、GenericPluginのwriteロックを取得したままon_change_sceneが呼ばれ、GenericPluginのwriteロックを取得しようとしてデッドロックする。
46    // `on_change_scene`を定義してあるかどうかを判定できれば、`register_change_scene_handler`に
47    // `GenericSingleton::with_instance_mut(|instance| instance.on_change_scene(...))`を登録するかどうかを判定して
48    // うっかりデッドロックを回避できるが、Rustではトレイトに関数を実装したかどうかを判定する手段がないため、on_change_sceneを本当に呼ぶべきかどうかを判定することができない。
49    // そのため、GenericPlugin::on_change_sceneを無効化する。
50    // いうてevent_change_scene_infoがあるのでなんとかなるんじゃないかなぁ...
51    //
52    // /// シーンを変更した直後に呼ばれる。
53    // fn on_change_scene(&mut self, edit_section: &crate::generic::EditSection) {
54    //     let _ = edit_section;
55    // }
56
57    /// オブジェクト情報が更新されたときに呼ばれる。
58    ///
59    /// # Note
60    ///
61    /// イベント用スレッドから呼び出されます。[`crate::generic::EditHandle::call_edit_section`]は利用できません。
62    fn event_update_object_info(&mut self) {}
63
64    /// フレームを移動した直後に呼ばれる。
65    ///
66    /// # Note
67    ///
68    /// イベント用スレッドから呼び出されます。[`crate::generic::EditHandle::call_edit_section`]は利用できません。
69    fn event_change_edit_frame(&mut self) {}
70
71    /// シーンを移動、またはシーン情報を変更したときに呼ばれる。
72    ///
73    /// # Note
74    ///
75    /// イベント用スレッドから呼び出されます。[`crate::generic::EditHandle::call_edit_section`]は利用できません。
76    fn event_change_scene_info(&mut self) {}
77
78    /// 選択されているオブジェクトが変更されたときに呼ばれる。
79    ///
80    /// # Note
81    ///
82    /// イベント用スレッドから呼び出されます。[`crate::generic::EditHandle::call_edit_section`]は利用できません。
83    fn event_change_focus_object(&mut self) {}
84
85    /// シングルトンインスタンスを参照するためのヘルパーメソッド。
86    ///
87    /// # Panics
88    ///
89    /// プラグインが初期化されていない場合や、二重に呼び出された場合にパニックします。
90    fn with_instance<R>(f: impl FnOnce(&Self) -> R) -> R
91    where
92        Self: crate::generic::__bridge::GenericSingleton,
93    {
94        <Self as crate::generic::__bridge::GenericSingleton>::with_instance(f)
95    }
96
97    /// シングルトンインスタンスを可変参照するためのヘルパーメソッド。
98    ///
99    /// # Panics
100    ///
101    /// プラグインが初期化されていない場合や、二重に呼び出された場合にパニックします。
102    fn with_instance_mut<R>(f: impl FnOnce(&mut Self) -> R) -> R
103    where
104        Self: crate::generic::__bridge::GenericSingleton,
105    {
106        <Self as crate::generic::__bridge::GenericSingleton>::with_instance_mut(f)
107    }
108}
109
110mod project;
111pub use project::*;
112mod edit_section;
113pub use edit_section::*;
114mod host_app;
115pub use host_app::*;
116mod edit_handle;
117pub use edit_handle::*;